package com.michael.leetcode;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class InsertRange_57 {
    /**
     * 57. 插入区间
     * 中等
     * 相关标签
     * 相关企业
     * 给你一个 无重叠的 ，按照区间起始端点排序的区间列表 intervals，其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束，并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。
     * 在 intervals 中插入区间 newInterval，使得 intervals 依然按照 starti 升序排列，且区间之间不重叠（如果有必要的话，可以合并区间）。
     * 返回插入之后的 intervals。
     * 注意 你不需要原地修改 intervals。你可以创建一个新数组然后返回它。
     * 示例 1：
     * 输入：intervals = [[1,3],[6,9]], newInterval = [2,5]
     * 输出：[[1,5],[6,9]]
     * 示例 2：
     * 输入：intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
     * 输出：[[1,2],[3,10],[12,16]]
     * 解释：这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
     * 提示
     * 0 <= intervals.length <= 104
     * intervals[i].length == 2
     * 0 <= starti <= endi <= 105
     * intervals 根据 starti 按 升序 排列
     * newInterval.length == 2
     * 0 <= start <= end <= 105
     */
    public int[][] insert(int[][] intervals, int[] newInterval) {
        int [][] newArr = new int[intervals.length+1][2];
        for(int i = 0; i < intervals.length; i++) {
            newArr[i] = intervals[i];
        }
        newArr[intervals.length] =  newInterval;

        // 排序
        Arrays.sort(intervals, (o1, o2) -> {
            if (o1[0]==o2[0]){
                return o1[1]-o2[1];
            }
            return o1[0]-o2[0];
        });

        int j = 0;
        int i = 1;
        while (j< newArr.length && i< newArr.length){
            if (newArr[j][1]>= newArr[i][0] && newArr[j][1]< newArr[i][1]){
                newArr[j][1] = newArr[i][1];
                newArr[i][0] = -1;
                newArr[i][1] = -1;
            }else if (newArr[j][1]>= newArr[i][1]){
                newArr[i][0] = -1;
                newArr[i][1] = -1;
            }else{
                j=i;
            }
            i++;
        }

        List<int []> list = new ArrayList<>();
        for (int k = 0; k < newArr.length; k++) {
            if (newArr[k][1]!=-1){
                list.add(newArr[k]);
            }
        }

        return list.toArray(new int[list.size()][2]);

    }


    @Test
    public void test() {
        int[][] intervals = {{1, 2}, {3, 5}, {6, 7}, {8, 10}, {12, 16}};
        int[] newInterval = {5, 8};
        int start = 0;
        int end = intervals.length;
        insert(intervals, newInterval);

    }

}